#include "../include/gps_utils.h" // JCube001/libgps 头文件

// 计算 NMEA 校验和
static unsigned char calculate_checksum(const char *sentence) {
    unsigned char checksum = 0;
    for (int i = 0; sentence[i] != '\0' && sentence[i] != '*'; i++) {
        checksum ^= sentence[i];
    }
    return checksum;
}

// 生成随机的 $GPGGA 句子
int read_nmea_sentence(char *buffer, size_t max_len) {
    // 初始化随机数种子
    static int seeded = 0;
    if (!seeded) {
        srand(time(NULL));
        seeded = 1;
    }

    // 随机生成字段
    int hour = rand() % 24;                    // 0-23
    int minute = rand() % 60;                  // 0-59
    int second = rand() % 60;                  // 0-59
    int millisecond = rand() % 1000;           // 0-999
    float latitude = (rand() % 9000000) / 1000000.0; // 0-90 度
    char ns = (rand() % 2) ? 'N' : 'S';        // 北/南
    float longitude = (rand() % 18000000) / 1000000.0; // 0-180 度
    char ew = (rand() % 2) ? 'E' : 'W';        // 东/西
    int fix_quality = rand() % 3;              // 0-2
    int satellites = rand() % 13;              // 0-12
    float hdop = 0.5 + (rand() % 1500) / 1000.0; // 0.5-2.0
    float altitude = -100 + (rand() % 1100000) / 1000.0; // -100 到 1000 米

    // 格式化纬度和经度 (ddmm.mmmm 格式)
    int lat_deg = (int)latitude;
    float lat_min = (latitude - lat_deg) * 60.0;
    int lon_deg = (int)longitude;
    float lon_min = (longitude - lon_deg) * 60.0;

    // 构造 NMEA 句子（不含 $ 和 *）
    char body[128];
    snprintf(body, sizeof(body),
             "GPGGA,%02d%02d%02d.%03d,%02d%07.4f,%c,%03d%07.4f,%c,%d,%02d,%.1f,%.1f,M,46.9,M,,",
             hour, minute, second, millisecond,
             lat_deg, lat_min, ns,
             lon_deg, lon_min, ew,
             fix_quality, satellites, hdop, altitude);

    // 计算校验和
    unsigned char checksum = calculate_checksum(body);

    // 构造完整句子
    snprintf(buffer, max_len, "$%s*%02X\r\n", body, checksum);
    return strlen(buffer);
}

// 检查用户输入（非阻塞）
int check_exit() {
    struct termios oldt, newt;
    int fd = STDIN_FILENO;
    char input[10] = {0};

    // 设置终端为非阻塞
    tcgetattr(fd, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(fd, TCSANOW, &newt);
    fcntl(fd, F_SETFL, O_NONBLOCK);

    // 读取输入
    int n = read(fd, input, sizeof(input) - 1);
    if (n > 0) {
        input[n] = '\0';
        if (strchr(input, 'q')) {
            tcsetattr(fd, TCSANOW, &oldt); // 恢复终端设置
            return 1;
        }
    }

    tcsetattr(fd, TCSANOW, &oldt); // 恢复终端设置
    return 0;
}

int main() {
    char sentence[128];
    struct gps_tpv tpv;

    // 初始化 tpv
    gps_init_tpv(&tpv);

    printf("程序运行中，按 'q' 退出...\n");

    // 循环读取和解析 NMEA 句子
    while (1) {
        if (check_exit()) {
            printf("收到 'q'，程序退出\n");
            break;
        }

        if (read_nmea_sentence(sentence, sizeof(sentence)) > 0) {
            printf("\nNMEA 句子: %s", sentence); // 调试：打印原始句子
            int result = gps_decode(&tpv, sentence);
            if (result == GPS_OK) {
                // 检查经纬度是否有效
                if (tpv.latitude != GPS_INVALID_VALUE && tpv.longitude != GPS_INVALID_VALUE) {
                    printf("时间: %s\n", tpv.time);
                    printf("纬度: %.6f\n", (float)tpv.latitude / GPS_LAT_LON_FACTOR);
                    printf("经度: %.6f\n", (float)tpv.longitude / GPS_LAT_LON_FACTOR);
                    printf("海拔: %.1f m\n", (float)tpv.altitude / GPS_VALUE_FACTOR);
                    printf("模式: %d (%s)\n", tpv.mode,
                           tpv.mode == GPS_MODE_UNKNOWN ? "Unknown" :
                           tpv.mode == GPS_MODE_NO_FIX ? "No Fix" :
                           tpv.mode == GPS_MODE_2D_FIX ? "2D Fix" : "3D Fix");
                } else {
                    printf("无效的 GPS 数据 (latitude/longitude invalid)\n");
                }
            } else {
                printf("解析错误: %s (%s)\n", sentence, gps_error_string(result));
            }
        } else {
            printf("无法读取 NMEA 句子\n");
        }

        // 模拟真实 GPS 输出频率（每秒一次）
        sleep(1);
    }

    return 0;
}